package model.prestamos.estado;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import model.prestamos.Prestamo;

import org.junit.Test;

import excepciones.prestamos.NoSePuedeAprobarPrestamoException;
import excepciones.prestamos.NoSePuedeCobrarCuotaException;
import excepciones.prestamos.NoSePuedePasarPrestamoADeudorIncobrableException;
import excepciones.prestamos.NoSePuedePasarPrestamoAEnDeudaException;
import excepciones.prestamos.NoSePuedeRechazarPrestamoException;

/**
 * @author Lucas
 */
public class PrestamoRechazadoTest {

	private Rechazado prestamoRechazado = new Rechazado("test");
	private Prestamo prestamoMock = mock(Prestamo.class);

	/**
	 * Getter del motivo
	 */
	@Test
	public void testGetterMotivo(){
		assertEquals("El motivo esperado deberia ser test", "test", prestamoRechazado.getMotivo());
	}
	
	/**
	 * Setter del motivo
	 */
	@Test
	public void testSetterMotivo(){
		prestamoRechazado.setMotivo("test2");
		assertEquals("El motivo esperado deberia ser test2", "test2", prestamoRechazado.getMotivo());
	}
	
	/**
	 * Verifica que un prestamo rechazado no se puede aprobar  
	 * @throws NoSePuedeAprobarPrestamoException
	 */
	@Test(expected=NoSePuedeAprobarPrestamoException.class)
	public void testNoSePuedeAprobarPrestamoEnCurso() throws NoSePuedeAprobarPrestamoException{
		prestamoRechazado.aprobar(prestamoMock);
	}
	
	/**
	 * Verifica que un prestamo rechazado no se puede volver a rechazar
	 * @throws NoSePuedeRechazarPrestamoException
	 */
	@Test(expected=NoSePuedeRechazarPrestamoException.class)
	public void testNoSePuedeRechazarPrestamoEnCurso() throws NoSePuedeRechazarPrestamoException{
		prestamoRechazado.rechazar(prestamoMock, "motivo cualquiera");
	}
	
	
	/** Verifica que no se puede cobrar la cuota de un prestamo rechazado 
	 * @throws NoSePuedeCobrarCuotaException */
	@Test(expected=NoSePuedeCobrarCuotaException.class)
	public void testNoSePuedeCobrarCuota() throws NoSePuedeCobrarCuotaException{
		prestamoRechazado.cobrarCuota(prestamoMock);
	}
	
	/** Verifica que un prestamo rechazado no puede pasarse a En Deuda 
	 * @throws NoSePuedePasarPrestamoAEnDeudaException */
	@Test(expected=NoSePuedePasarPrestamoAEnDeudaException.class)
	public void testNoSePuedePasarPrestamoAEnDeuda() throws NoSePuedePasarPrestamoAEnDeudaException{
		prestamoRechazado.pasarPrestamoAEnDeuda(prestamoMock);
	}
	
	/** Verifica que un prestamo rechazado no puede pasarse a Deuda incobrable 
	 * @throws NoSePuedePasarPrestamoADeudorIncobrableException */
	@Test(expected=NoSePuedePasarPrestamoADeudorIncobrableException.class)
	public void testNoSePuedePasarPrestamoDeRechazadoAEnDeudaIncobrable() throws NoSePuedePasarPrestamoADeudorIncobrableException{
		prestamoRechazado.pasarPrestamoADeudorIncobrable(prestamoMock);
	}
	
	/** Verifica que el prestamo no esta solicitado */
	@Test
	public void testPrestamoNoEsSolicitado(){
		assertFalse(prestamoRechazado.estaSolicitado());
	}
	
	/** Verifica que el prestamo no esta en curso */
	@Test
	public void testPrestamoEstaEnCurso(){
		assertFalse(prestamoRechazado.estaEnCurso());
	}
	
	/** Verifica que el prestamo no esta en deuda */
	@Test
	public void testPrestamoNoEstaEnDeuda(){
		assertFalse(prestamoRechazado.estaEnDeuda());
	}
	
	/** Verifica que el prestamo no esta en deuda incobrable */
	@Test
	public void testPrestamoNoEstaEnDeudaIncobrable() {
		assertFalse(prestamoRechazado.estaEnDeudaIncobrable());
	}
	
	/** Verifica que el prestamo no esta finalizado */
	@Test
	public void testPrestamoNoEstaFinalizado() {
		assertFalse(prestamoRechazado.estaFinalizado());
	}

	/** Verifica que el prestamo esta rechazado */
	@Test
	public void testPrestamoNoEstaRechazado() {
		assertTrue(prestamoRechazado.estaRechazado());
	}
	
	/** Verifica que un prestamo rechazado no adeuda cuotas */
	@Test
	public void testPrestamoRechazadoNoAdeudaCuotas(){
		assertFalse(prestamoRechazado.adeudaCuotas(prestamoMock));
	}
}
